package com.cskaoyan.javase.oop1._13block._2static._1usecase;

import com.sun.org.apache.bcel.internal.generic.NEW;

/**
 * 静态代码块在实际开发中，并不常见。根据它的一些特点，可以总结一下它的使用场景
 *      1.复杂的静态成员变量的赋值。
 *          JavaEE中加载JDBC驱动（最经典的），也可能是最常见的。
 *
 *      2.类加载只有一次,所以某个类的静态代码块最多执行一次
 *          如果有一段代码，在类的全局，从始至终，只运行一次，可以写到静态代码块中。
 *          比如一些初类的始化工作，就可以放在静态代码块中完成。
 *      3.静态代码块也经常被用来测试类加载的顺序（重要）
 *          一个类的静态代码块如果没有被执行，说明它没有被完全类加载。
 *
 *
 * @since 09:41
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    static {
        System.out.println("Demo类类加载了!");
    }

    public static void main(String[] args) {
        // System.out.println("hello world!");
        new A();
        // System.out.println(B.num);
        B.test();

        new C();
    }
}

class A {
    static {
        System.out.println("A");
        // 在静态代码块中定义变量是定义静态变量吗?
        // 当然不是
        // 静态代码块中是什么位置? 局部位置 定义的变量是局部变量
        int a = 100;
    }
}

class B {
    static {
        System.out.println("B");
    }

    static int num = 100;

    static void test() {
    }
}

class C {
    // 在类的成员变量列表中创建自身对象是不行的
    // C c = new C();

    // 在C类的类加载过程中,去创建C的对象,既然C还没有类加载完成,那么如何创建它的对象呢?
    static  C c = new C();
    public C() {

    }
}